package com.odontosis.service;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import sun.awt.geom.AreaOp.CAGOp;

import com.odontosis.as.OdontosisApplicationService;
import com.odontosis.dao.ServicoConveniadoDAO;
import com.odontosis.entidade.Paciente;
import com.odontosis.entidade.Procedimento;
import com.odontosis.entidade.ServicoConveniado;
import com.odontosis.util.ChaveComposta;
import com.odontosis.util.DateDiff;

public class ServicoConveniadoService extends OdontosisApplicationService<ServicoConveniado> {

	private final ServicoConveniadoDAO dao = new ServicoConveniadoDAO();
	
	public ServicoConveniadoService() throws Exception {
		super(ServicoConveniado.class, new ServicoConveniadoDAO());
	}
	
	public Collection<ServicoConveniado> pesquisarPorNomePaciente(String nome){
		return dao.pesquisarPorNomePaciente(nome);
	}
	
	public Collection<ServicoConveniado> pesquisarPorDataECodigo(Date inicio, Date fim, String codigo){
		return dao.pesquisarPorDataECodigo(inicio, fim, codigo,true);
	}
	
	public Collection<ServicoConveniado> pesquisarPorDataECodigoSemPericia(Date inicio, Date fim, String codigo){
		return dao.pesquisarPorDataECodigo(inicio, fim, codigo,false);
	}
	
	/**
	 * Método para retornar os pacientes em tratamento sem FIOD em determinado período
	 * 
	 * @param inicio
	 * @param fim
	 * @param ipsms
	 * @return
	 */
	public List<Object[]> pesquisarPorPeriodoPacienteSemFIOD(Date inicio, Date fim, String ipsms) {
		List<Object[]> retorno = new ArrayList<Object[]>();
		List<Paciente> pacientes = dao.buscarPacientes(ipsms, true);
		List<ServicoConveniado> fiods = dao.buscarServicoConveniado(inicio, fim, ipsms);
		Map<ChaveComposta,ServicoConveniado> mapaFiods = new HashMap<ChaveComposta, ServicoConveniado>();
		
		for (ServicoConveniado servicoConveniado : fiods) {
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(servicoConveniado.getData());
			Integer mesAno = (calendar.get(Calendar.YEAR) * 100) + (calendar.get(Calendar.MONTH) + 1);
			mapaFiods.put(new ChaveComposta(servicoConveniado.getPaciente(),mesAno), servicoConveniado);
		}
		
		int diferencaMeses = DateDiff.getDateDiff(Calendar.MONTH, inicio, fim);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(inicio);
		int mesInicio = calendar.get(Calendar.MONTH);
		int anoInicio = calendar.get(Calendar.YEAR);
		
		for(int i = 0; i <= diferencaMeses ; i++ ) {
			mesInicio++;
			
			for(Paciente paciente : pacientes) {
				Calendar dataIteracao = Calendar.getInstance();
				Integer mesAno = anoInicio * 100 + mesInicio;
				ServicoConveniado convenio = mapaFiods.get(new ChaveComposta(paciente,mesAno));
				if(convenio == null) {
					Object[] objeto = new Object[3];
					objeto[0] = paciente;
					objeto[1] = mesInicio;
					objeto[2] = anoInicio;
					retorno.add(objeto);
				}
			}
			
			if(mesInicio >= 12 ) {
				mesInicio = 0;
				anoInicio++;
			}
		}
		
		return retorno;
	}
	
	public Collection<ServicoConveniado> pesquisarPorPacientePastaPeriodo(String nomePaciente, String pasta, Date inicio, Date fim){
		return dao.pesquisarPorPacientePastaPeriodo(nomePaciente, pasta, inicio, fim);
	}
	
	public Integer proximaParcela(Paciente paciente, Set<Procedimento> procedimentos) {
		if(procedimentos.size() > 1 ) {
			return 0;
		}
		
		Procedimento procedimento = null; 
		for( Procedimento procAux : procedimentos) {
			procedimento = procAux;
		}
		
		if(!procedimento.isManutencao()) {
			return 0;
		}
		
		Long numParcelaLong = dao.numeroParcelasJaGeradas(procedimento, paciente);
		Integer numParcela = numParcelaLong.intValue();
		if(numParcela == null) {
			return 1;
		}
		/*if(numParcela >= 24 ) {
			return (numParcela % 24) + 1;
		}*/
		
		return numParcela + 1;
	}

}
